יצא לי לקרוא המון פעמים שמתכנתים שעוד לא יודעים לעבוד עם תכנות מונחה עצמים פשוט "משתגעים" ולא מצליחים להבין למה זה עוזר ולמה כדאי להשתמש במחלקות ולא בדרך ה"רגילה" והארוכה יותר. (שגם הם לא מצליחים להבין למה הדרך ה"רגילה" ארוכה יותר).
אז בתור אחד שחווה את החוויה הזאת לפני כשנה, חוויה שליוותה אותי כמה חודשים בניסיון להבין מדוע אני צריך להשתמש בתכנות מונחה עצמים, החלטתי לבוא לפה, ולנסות להסביר בצורה הטובה ביותר שאפשר לאנשים שמתקשים ושנמצאים במצב שבו אני הייתי לפני כשנה.
אז כמו שהבנתם, לפני כשנה נתקלתי בבעיה הזאת בדיוק כמוכם (במידה ואתם באמת תקועים בבעיה הזאת ולא סתם קוראים את המאמר כי משעמם לכם).
אז הנה כל ההסברים והטיפים שתוכלו לקבל על מנת להבין יותר טוב בשביל מה צריך את הדבר הזה שנקרא OOP (Object-Oriented Programming, או בעברית, תכנות מונחה עצמים).
נתחיל מדוגמא פשוטה, מערכת משתמשים.
יש לנו מערכת ובה אנחנו רוצים 2 עמודים שבהם יש את כל המשתמשים באתר ואת כל המשתמשים של הצוות.
בדרך ה"רגילה" כביכול, נצטרך ליצור 2 דפים ובהם קודים כאלו:
הקוד לדף המשתמשים:
$q = mysql_query("SELECT * FROM members WHERE type != 'admin'");
while ($row = mysql_fetch_assoc($q))
{
$q2 = mysql_query("SELECT * FROM posts WHERE id='".$row["id"]."'");
echo "username: ".$row["username"]."<br />";
echo "full name: ".$row["fullname"]."<br />";
echo "email: ".$row["email"]."<br />";
echo "posts: ".mysql_num_rows($q2)."<br />";
}
while ($row = mysql_fetch_assoc($q))
{
$q2 = mysql_query("SELECT * FROM posts WHERE id='".$row["id"]."'");
echo "username: ".$row["username"]."<br />";
echo "full name: ".$row["fullname"]."<br />";
echo "email: ".$row["email"]."<br />";
echo "posts: ".mysql_num_rows($q2)."<br />";
}
הקוד לדף הצוות:
$q = mysql_query("SELECT * FROM members WHERE type = 'admin'");
while ($row = mysql_fetch_assoc($q))
{
$q2 = mysql_query("SELECT * FROM posts WHERE id='".$row["id"]."'");
echo "username: ".$row["username"]."<br />";
echo "full name: ".$row["fullname"]."<br />";
echo "email: ".$row["email"]."<br />";
echo "posts: ".mysql_num_rows($q2)."<br />";
}
while ($row = mysql_fetch_assoc($q))
{
$q2 = mysql_query("SELECT * FROM posts WHERE id='".$row["id"]."'");
echo "username: ".$row["username"]."<br />";
echo "full name: ".$row["fullname"]."<br />";
echo "email: ".$row["email"]."<br />";
echo "posts: ".mysql_num_rows($q2)."<br />";
}
כמובן שעכשיו הכל עובד יפה והקוד לא כל כך ארוך.
אבל בואו נגיד שהיינו צריכים לבדוק גם אם המייל אמיתי, באורך של 10 תווים. והשם המלא הוא באמת מלא (מכיל שם פרטי ומשפחה), אנחנו גם רוצים לבדוק שהמשתמש באמת קיים, ועוד הרבה פונקציות נוספות.
במצב הזה הקוד יגדל פי 3 ונצטרך לכתוב אותו כל פעם בכל מקום שנרצה, בטח אתם חושבים לעצמכם, אפשר לעשות את זה בדף אחד ולא בשניים כמו שאמרת, אבל אני מנסה להסביר בצורה הטובה ביותר, גם אם אני לא כותב תקין ביותר.
נחזור לעניין, תכנות מונחה עצמים נותן לנו ליצור מחלקה (שנקראת ביצירה שלה "אובייקט"), בתוך המחלקה אפשר לכתוב תכונות ומתודות.
כדי שתבינו יותר טוב, בואו נעבור לדוגמא,
בכדור הארץ יש את חיים, בן אדם נחמד שעובד בהייטק, חיים הוא בן אדם, מה שאומר, שאנחנו זקקים למחלקת בני האדם, אבל אפשר לחסוך את זה עוד יותר, מה עם מיצי, החתולה? היא נחשבת בעל חיים, וגם בני אדם הם בעל חיים.
במצב הזה אנחנו צריכים מחלקה אחת בלבד, מחלקת בעלי חיים.
במחלקה הזאת אנחנו יכולים לקבוע תכונות, כמו ידיים, רגיליים, עניים, שם, משקל וכו..
ומתודות שבודקות לנו האם כמות הרגליים מספיקה כדי להרים את בעל החיים או שהוא פשוט לא יצליח לזוז (לדגומא כמובן).
בדרך ה"רגילה" אתם פשוט תתחברו מלא פעמים למסד, תכתבו מלא פונקציות, ותעשו מלא בדיקות שחוזרות על עצמם עם כל בעל חיים, ואל תשכחו שתצטרכו גם לשכפל לכל בעל חיים שנמצא בעולם, המתחכמים בניכם יגידו שאפשר לעשות את זה קצר בשימוש בפונקציות, וזה נכון מאוד, אבל היום נהוג להשתמש במחלקות ולא בכל כך הרבה פונקציות.
בדרך ה OOP, סה"כ תצטרכו ליצור אובייקט (מחלקה) לקבוע את התכונות ולאחר מכן פשוט מאוד להשתמש במתודות.
אני אדגים לכם: יש לנו מחלקת בני אדם, ובה תכונות של כמות ידיים ורגליים, משקל, גיל ושם, המתודות שלנו זה אם הבן אדם מספיק חזק כדי להרים את עצמו, וגם מתודה שמשערת כמה זמן נותר לבן אדם לחיות.
ניצור אובייקט חדש בשם משה, ונקבע שיש לו 2 רגליים ויד אחת, הוא שוקל 56 והגיל שלו הוא 21, ניצור גם עוד אובייקט בשם שולה, לשולה יש 2 רגליים ו 2 ידיים, היא שוקלת 84 והגיל שלה הוא 72.
עכשיו אנחנו רוצים לבדוק אם שולה יכולה ללכת, או שהיא לא מספיק חזקה בשביל זה, נשתמש במתודה לבדיקה המתאימה ונקבל תוצאה (אמת או שקר, או כל דבר אחר).
ואנחנו רוצים לבדוק עוד כמה זמן נשאר למשה לחיות, נשתמש גם כן במחלקה המתאימה. (שהיא תחזיר לנו מספר כלשהו).
דוגמא שנייה, מערכת פורומים.
אני לא אתחיל לדבר איתכם על כל המערכות ואיך היא בנויה כמובן, אבל נעבוד כרגע על דף ההודעות עצמו.
ניצור מחלקת משתמשים עם התכונות (מזהה, שם משתמש, סיסמא, שם מלא, אימייל, סוג).
ועם מתודה אחת שבודקת אם המשתמש יכול לכתוב הודעה.
ניצור מחלקה להודעות שלנו עם התכונות (מזהה, כותרת, תוכן, יוצר ההודעה (המזהה שלו) ותאריך יצירה).
ומתודות של יצירת הודעה, תגובה על הודעה ולפני כמה זמן ההודעה נוצרה.
נכתוב שאילתה שלוקחת את 10 ההודעות האחרונות, ונשתמש בלולאה כדי להציג אותם.
בכל פעם שהלולאה רצה, ניצור אובייקט הודעה ונציג את התכונות שלה (כמובן שהמחלקה צריכה לעבוד עם מסד נתונים כדי לקבל את כל ההודעות, ואותו דבר לגבי מחלקת משתמשים).
עכשיו נוכל בכל פעם להציג את הפרטים של ההודעה בקלות, ונוכל גם להשתמש בכל מני מתודות (במערכת פורומים, מתודות כמו נעילת הנושא, נעיצה שלו, מחיקה שלו וכו..).
נרצה כמובן להציג גם את פרטי המשתמש, לא מספיק שרואים רק את המזהה שלו (ID).
בכל פעם שהלולאה רצה נוסיף גם אובייקט של מחלקת המשתמשים וביצירה שלו (בעזרת מתודת הקסם construct, שעליה תלמדו בהמשך, אבל בהסבר קצר, זאת מתודה שמופעלת בעת יצירת המחקה) נכניס את המזהה של המשתמש, עכשיו יהיה אפשר להשתמש בתכונות ובמתודות של המשתמש ולבדוק אם הוא יכול להגיב, מה השם משתמש שלו וכו...
עד פה המאמר הראשון שלי בנושא תכנות מונחה עצמים (והראשון שלי בכלל), אני מקווה שהצלחתם להבין קצת יותר טוב את הנושא, במאמרים הבאים שלי אני אתחיל ללמד מעשית תכנות מונחה עצמים.
לכל שאלה, הצעה, הערה והארה, תוכלו לתת תגובה :)
תגובות לכתבה:
מעולה. תודה רבה על הפרסום ניר.
מקווה שזה יעזור למתחילים.
לדעתי יש קפיצות מהירות מדי בין הנושאים וקשה לעקוב אחרי המחשבות.
קודם שנים של בעיות, אחרי זה פתאום עמוד, אחרי זה פתאום שולה וחיים שצריך למות ואחרי זה שוב העמוד הזה, ואחרי זה קדור הארץ עם מיצי.
הרעיונות המרכזיים פחות בולטים וקשה להוציא אותם מהתוכן
כמו זה שתחסוך לעצמך הרבה מאוד קוד, תוכל להעביר קוד מפרוייקט לפרוייקט וליצור ירושה
והשינוי העתידי יהיה קל יותר בזכות זה שאין קוד שחוזר על עצמו.
אוקיי, תודה על העצות, אני אנסה לשפר את המאמר, בכל זאת, מאמר ראשון שלי.
יש כבר מלא כאלה, מיותר.
ניסיתי בעבר להסביר את התיאוריה של תכנות מונחה עצמים,
קשה לדחוס את זה לזמן קצר,
אבל הנה קישור:http://phpguide.co.il/OOP תכנות מונחה עצמים מבוא.htm
בכל אופן, מה שחסר גם בכתבה הזו זה בעיקר דוגמאות קוד, והרבה..
מי שבכל זאת מתקש מומלץ להתחיל לנסות לעבוד עם פריימוורק כלשהו.
בכל אופן, סחטיין על ההשקעה, נקווה לראות עוד כתבות טובות שלך.
במאמר הבא אני כבר אביא דוגמאות קוד כפי שכתבתי בתחתית המאמר, תודה רבה על התגובות!
אני גם כותב על OOP אבל באתר שלי - http://www.lior-portal.co.il/php/oop-בphp/תכנות-מונחה-עצמים-בphp-חלק-1/
אשמח שאולי נעשה משהו ביחד.
דרך אגב, אני מכיר אותך מFXP.
http://www.youtube.com/watch?v=yg3Wx-JCzjE
:)) אחלה שיר pol